nginx 代理多台机器导致用户登陆异常,长连接(会话保持)解决问题

        网站使用程序 discuzx3 访问都正常,只有用户登陆存在异常,具体的情况是这样的:

        用户登陆后,会马上显示未登陆,然后刷新一下或者多下又变成了登陆中。

        这个问题很显然是由于session导致,后台有多个web机器,当用户登陆后,会把登陆态session保存到当前web,但是再次发送请求时则会到另一台机器,所以原来的session信息找不到了。解决这个问题有两个思路:

  1. 可以把session时时同步到另外的机器。

  2. 可以让前端的调度器保持长连接,也就是说某个用户的请求在某一时间段内始终抓发到固定的一台机器上。

        这两种方式,第二种更容易实现。

        我使用的是nginx的代理,其中nginx有一种算法支持长连接,具体配置是这样的:

1
2
3
4
5
upstream test {
ip_hash;
server 192.168.109.5;
server 192.168.109.3;
}

        关键代码: ip_hash

        

1
E = mc^2

这样,nginx会把用户的请求一直转发到后端的某台机器。